// 最小栈  
// 实现一个栈，带有 pop 出栈，push入栈，getMin方法 O(1)
// O(n) -> O(1)  空间换时间  i
// push i 指针 最小值  
// 缺点  
// 1. 栈 熟悉[]  push pop 连续
// 2. ADT 没有getMin这个方法的 O(n)
// 3.  指针变量i 最小值，出栈 i 
// 4. 空间换时间 双栈 
// 用栈来实现队列  
var MinStack = function() {
    this.stack = []; // 栈
    this.MinStack = []; // 辅助栈 入栈的是最小值，最小值在最上面
}
// 把常考算法做为手写题来处理
MinStack.prototype.push = function(x) {
    if(!this.MinStack.length || x < this.getMin()) {
        this.MinStack.push(x);
    } 
    this.stack.push(x);
}

MinStack.prototype.pop = function() {
    let x = this.stack.pop();
    if(x == this.getMin()) {
        this.MinStack.pop();
    }
}

MinStack.prototype.getMin = function() {
    if(!this.MinStack.length) {
        throw new Error('stack is empty')
    }
    return this.MinStack[this.MinStack.length-1];
}